<#include "/@inc/funcMacros.ftl">
<#assign className = TriaGram + "E" + Prefix + LateType + "Replace">
<#assign baseName = TriaGram + Prefix + LateType>
<#assign intfName = TriaGram + "I" + Prefix + LateType>
<#include "/@inc/copyright.txt">
<@pp.renameOutputFile name=className +".h">
</@pp.renameOutputFile>
#ifndef __${className}_H
#define __${className}_H
<#include "/@inc/copyright.txt">

//===========================================================================
//  Abstract of the class:
//  ----------------------
//
//  Data extension implementing the CATIReplace interface
//  which  manages the replacement of a Feature by another one for a given Role.
//
//
//  This extension extends the ${LateType} Feature.
//
//===========================================================================

// ObjectSpecsModeler Framework
#include "CATSpecReplaceExt.h"   // The adapter class for the Replace Capability

class CATISpecObject_var;        // To handle features

class ${className} : public CATSpecReplaceExt
{
   CATDeclareClass;

 public :

   ${className}();
   virtual ~${className}();


   HRESULT IsElementValidForReplace(const CATUnicodeString& iNameOfRole,
                                   const CATBaseUnknown_var& ispElement,
                                   CATUnicodeString& oMessage,
                                   int& oElementValidity,
                                   const CATBaseUnknown_var& ispOldValue=NULL_var);

   HRESULT Replace(const CATUnicodeString& iNameOfRole,
                   CATBaseUnknown_var& ispNewElement,
                   const CATBaseUnknown_var& ispOldValue=NULL_var);


 private:

    // Copy constructor, not implemented
    // Set as private to prevent from compiler automatic creation as public.
    ${className}(const ${className} &iObjectToCopy);

    // Assignment operator, not implemented
    // Set as private to prevent from compiler automatic creation as public.
    ${className} & operator = (const ${className} &iObjectToCopy);

   // On the fly featurization for selection objects
   CATISpecObject_var ExtractFeature(const CATBaseUnknown_var& ispSelectedObject);


   CATISpecObject_var InvertFeature(const CATBaseUnknown_var& ispSelectedObject,
                                    const CATISpecObject_var& ispCurrentSpec);


};

#endif
